<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/model/Service/Service.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/model/DAO/EmployeeDAO.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/model/DAO/PersonDAO.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/entities/Employee.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/entities/Person.php';
// удалить, это здесь для тестирования работоспособности!!!
require_once $_SERVER['DOCUMENT_ROOT'].'/model/Service/ServiceFactory.php';

/**
 * Класс, реализующий работу со списком сотрудников в БД  
 */
class EmployeeDAOImpl extends EmployeeDAO {

	/**
	 * Метод, создающий новую запись сотрудника в БД
	 */
	public function create(Entity $employee) {
/*		// при назначении сотрудника на новую должность в объект $employee
		// в поле $identity записываеся идентификатор должности, на которую
		// осуществляется назначение, после выполнения запроса в это поле
		// записывается идентификатор самого назначения
		// (значение `employee`.`id` из базы данных)
		$person = $employee->getPerson();
		$sql = 'INSERT INTO `employee` (`id_person`,`id_post`,`rate`) ';
		$sql .= 'VALUES ('.$person->getIdentity().',';
		$sql .= $employee->getIdentity().',';
		$sql .= $employee->getRate().')';
		$this->query($sql);
		$employee->setIdentity($this->identity());
		return $employee;
*/
				
		// при назначении сотрудника на новую должность в объект $employee
		// в поле $identity записываеся идентификатор должности, на которую
		// осуществляется назначение, после выполнения запроса в это поле
		// записывается идентификатор самого назначения
		// (значение `employee`.`id` из базы данных)
		$person = $employee->getPerson();

		$personId = $person->getIdentity();
		$postId = $employee->getIdentity();
		$rate = $employee->getRate();
		
		$stmt = $this->dbh->connection->prepare('INSERT INTO `employee` (`id_person`, `id_post`, `rate`) VALUES (?, ?, ?)');
		$stmt->bindValue(1, $personId);
		$stmt->bindValue(2, $postId);
		$stmt->bindValue(3, $rate);
		
		try {
			$this->dbh->query($stmt);
			$employee->setIdentity($this->dbh->identity());
			return $employee;
		} catch (PDOException $exception) {
			return null;
		}
		
	}

	/**
	 * Метод, отвечающий за чтение записи сотрудника из БД
	 */
	public function read($identity) {
/*		$sql = 'SELECT `id_person` ';
		$sql .= 'FROM `employee` ';
		$sql .= 'WHERE `id`='.$identity;
		$this->query($sql);
		$personIdentity = null;
		if($row = $this->row()){
			$personIdentity = $row['id_person'];
		}
		$this->close();
		if($personIdentity !== null) {
			$service = getService('PersonService');
			$person = $service->read($personIdentity);
			if($person !== null) {
				$posts = $person->getPosts();
				foreach($posts as $post) {
					if($post->getIdentity() == $identity) {
						return $post;
					}
				}
			}
		}
		return null;
*/

		$id = (int)($identity);
		
		$stmt = $this->dbh->connection->prepare('SELECT `id_person` FROM `employee` WHERE `id`=?');
		$stmt->bindValue(1, $id);
		$this->dbh->query($stmt);
		$personIdentity = null;
		if($row = $this->dbh->row()){
			$personIdentity = $row['id_person'];
		}
		$this->dbh->close();
		if($personIdentity !== null) {
			// удалить потом это!!!
// 			$serviceFactoy = new ServiceFactory(); // Создаем фабрику сервисов
// 			$service = $serviceFactoy->getService('PersonService');// Получаем нужный сервис			
// 			// это раскомментить, это исходное!!!
// 			//$service = getService('PersonService');
// 			$person = $service->read($personIdentity);
			$person = new Person();
			$person->setIdentity($personIdentity);
			// Зачем пока что не понятно
// 			if($person !== null) {
// 				$posts = $person->getPosts();
// 				foreach($posts as $post) {
// 					if($post->getIdentity() == $id) {
// 						return $post;
// 					}
// 				}
// 			}
			return $person;
		}
		return null;
		
	}

	/**
	 * Метод, отвечающий за обновление записи сотрудника в БД
	 * p.s: Реализация не требуется
	 */
	public function update(Entity $employee) {
		return null;
	}

	/**
	 * Метод, отвечающий за удаление записи сотрудника из БД
	 */
	public function delete($identity) {
/*		$sql = 'DELETE FROM `employee` ';
		$sql .= 'WHERE `id`='.$identity;
		$this->query($sql);
		return true;
*/		
		$id = (int)($identity);
		
		$stmt = $this->dbh->connection->prepare('DELETE FROM `employee` WHERE `id`=?');
		$stmt->bindValue(1, $id);
		
		try {
			$this->dbh->query($stmt);
			return true;
		} catch (PDOException $exception) {
			return false;
		}
		
	}
	
	/**
	 * Метод, отвечающий за получение записи сотрудника по ставке и т.п.
	 */
	public function getPersonPosts(Person $person) {
/*		$sql = 'SELECT `employee`.`id`,`post`.`name`,`post`.`is_unique`,`employee`.`rate` ';
		$sql .= 'FROM `employee` INNER JOIN `post` ON `employee`.`id_post`=`post`.`id` ';
		$sql .= 'WHERE `employee`.`id_person`='.$person->getIdentity().' ';
		$sql .= 'ORDER BY `rate` DESC';
		$this->query($sql);
		$posts = array();
		while($row = $this->row()) {
			$post = new Employee();
			$post->setIdentity($row['id']);
			$post->setName($row['name']);
			$post->setUnique($row['is_unique']);
			$post->setPerson($person);
			$post->setRate($row['rate']);
			$posts[] = $post;
		}
		$this->close();
		return $posts;
*/
		
		$id = $person->getIdentity();

		$stmt = $this->dbh->connection->prepare('SELECT `employee`.`id`, `post`.`name`, `post`.`is_unique`, `employee`.`rate` FROM `employee` INNER JOIN `post` ON `employee`.`id_post`=`post`.`id` WHERE `employee`.`id_person`=? ORDER BY `rate` DESC');
		$stmt->bindValue(1, $id);
		$this->dbh->query($stmt);
		
		$posts = array();
		while($row = $this->dbh->row()) {
			$post = new Employee();
			$post->setIdentity($row['id']);
			$post->setName($row['name']);
			$post->setUnique($row['is_unique']);
			$post->setPerson($person);
			$post->setRate($row['rate']);
			$posts[] = $post;
		}
		$this->dbh->close();
		return $posts;
		
	}
}
?>